home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload Trio 2 / Shareware Overload Trio Volume 2 (Chestnut CD-ROM).ISO / dir42 / genscr18.zip / GENSCRNX.TXT < prev    next >
Text File  |  1994-01-26  |  39KB  |  1,288 lines

  1. GENSCRNX 1.8
  2.  
  3.  
  4.  
  5. INTRODUCTION
  6.  
  7.  
  8. GENSCRNX.PRG extends the control of code generated from FoxPro's 
  9. screen builder.  After Generate... is selected when using the Screen 
  10. Builder, GENSCRNX first copies the .SCX database and then updates it 
  11. based on comments in the snippets and setup code.  Also, GENSCRNX 
  12. places the .SPR into a memo field after its created to make possible code 
  13. changes and/or replacements after GENSCRN.  The ability to define 
  14. each object into a global database called FOXSCX.DBF is performed 
  15. when a define object directive is placed in an object's comment code.  
  16. The FOXSCX.DBF contains the same structure as FoxPro's .SCX files 
  17. except has added fields for object name, field, library, and other objects 
  18. that it bases from.  New screens can be created without snippet code by 
  19. simply placing a base object directive in the comment snippet with the 
  20. appropriate name.  GENSCRNX updates the .SCX before passing it to 
  21. GENSCRN.  Drivers can be defined in the CONFIG.FP and screen Setup 
  22. snippet code.  Every driver is called once for each record in the .SCX 
  23. before GENSCRN generates code.  The driver may update the .SCX 
  24. database with no limitations.  Objects can be manipulated or replaced by 
  25. pure FoxPro code using a driver procedure.  GENSCRNX handles the 
  26. code replacements to the .SPR.  A driver may use pre-made functions 
  27. contained in GENSCRNX which handle the .SCX record update for code 
  28. replacement, template insertion, and other .SCX update functions.  A 
  29. DEFINE WINDOW command can be inserted in the .SPR between the 
  30. GET/SAY fields in the Screen Layout section..  Multiple drivers may also 
  31. be selected for functions such as 3D effects or auto insertion of push 
  32. buttons (Next, Previous, Append, Delete, etc.).  GENSCRNX is entirely 
  33. written in FoxPro and fully compatible with FoxPro 2.0 and FoxPro 2.5 (all 
  34. platforms).  The FOXSCX library database can be updated when 
  35. referenced by FoxPro 2.0 and/or FoxPro 2.5 for MS-DOS without any 
  36. conversion.  FoxPro 2.5 for MS-DOS MS-DOS applications can be built 
  37. by referencing objects created with FoxPro 2.0 and vice versa.  The 
  38. FOXSCX.DBF database  can contain records for FoxPro 2.5 (all platform) 
  39. while GENSCRNX automatically handles the record relation between 
  40. platforms.
  41.  
  42. Notes:
  43. CONFIG.FP relates to FoxPro 2.0 and FoxPro 2.5 DOS.
  44. CONFIG.FPW relates to FoxPro 2.5 Windows.
  45.  
  46.  
  47.  
  48.  
  49. FEATURES
  50.  
  51.  
  52. - Extended control over FoxPro's Screen Builder without changing 
  53. GENSCRN.  GENSCRNX can be though of as a WHEN and VALID for 
  54. GENSCRN.
  55.  
  56. - Option for compiling the output file when generating from the Screen 
  57. Builder.
  58.  
  59. - Option for displaying the .SPR and .ERR files if an .ERR file is 
  60. generated after compiling the output file when generating from the 
  61. Screen Builder.
  62.  
  63. - Ability to store screen objects into a database library.
  64.  
  65. - Ability to retrieve screen objects from a database library with support of 
  66. multiple inheritance (expressions are separated by .AND. while 
  67. procedures are appended).
  68.  
  69. - Option to set Read level settings (OpenFiles, CloseFiles, Modal, 
  70. OutFile, etc.) from with the screens setup that override the Generate 
  71. dialog checkboxes.  This allows settings to be saved with the screen 
  72. without using a project.
  73.  
  74. - Ability to insert records contained in a separate .SCX file at compile 
  75. time.  All records row and column information is automatically adjusted.  
  76. This allows subforms to be inserted without copy and paste.  If the 
  77. inserted screen is updated, the screen importing it can be re-generated 
  78. without change.
  79.  
  80. - Ability to insert FoxPro code in place of any screen object.  This allows 
  81. a line or multiple lines of FoxPro code to be generated between GET 
  82. commands in the Screen Layout section.
  83.  
  84. - Ability to block a GET command with any IF/ENDIF statement.
  85.  
  86. - Ability to specify any SIZE clause and override the SIZE setting 
  87. defaulted by the Screen Builder.
  88.  
  89. - Ability to remove the SIZE clause from any GET command.
  90.  
  91. - Ability to create .PRG drivers that update the .SCX database at compile 
  92. time before GENSCRN is called.  This allows external programs to be 
  93. created that automatically add, update, or remove code of any screen 
  94. snippet.  Drivers can make function calls to many of GENSCRNX's built 
  95. in function library for parsing or insertion of .SCX information. 
  96.  
  97. - Support for any expression to be evaluated at compile time using 
  98. {{<expC>}} in any snippet or field.  GENSCRNX will evaluate <expC> at 
  99. compile time and replace {{<expC>}} with its result.  If <expC> was an 
  100. external function and the command was placed in the Setup snippet, the 
  101. external function could act like a #INCLUDE function by returning multiple 
  102. lines of code.
  103.   Example:
  104.   If the following command was in the Setup snippet and assuming the 
  105. current date was 06/01/93:
  106.       WAIT '{{DATE()}}' WINDOW NOWAIT
  107.   the following code would be placed in the .SPR:
  108.       WAIT '06/01/93' WINDOW NOWAIT
  109.  
  110.  
  111.  
  112.  
  113. INSTALLATION
  114.  
  115.  
  116. After unzipping GENSCRNX.ZIP, copy GENSCRNX.PRG to all existing 
  117. FoxPro 2.x directories
  118.  
  119. Change all CONFIG.FP and CONFIG.FPW files to:
  120.  
  121. _GENSCRN="<path>GENSCRNX.PRG"
  122.  
  123. MVCOUNT=512
  124.  
  125. Notes:
  126. If  MVCOUNT is already set to a number greater than 512, then do not 
  127. change it.  If MVCOUNT is set to a number less than 512, then change 
  128. the number to 512.  If a line containing MVCOUNT does not exist, then 
  129. create one as above.
  130.  
  131.  
  132.  
  133.  
  134. CONFIG.FP/CONFIG.FPW OPTION SETTINGS
  135.  
  136.  
  137. _GENSCRNX
  138.  
  139. Specifies program to generate .SPR file from .SCX database.
  140.  
  141. Default:
  142. _GENSCRNX="<path>GENSCRN.PRG" in FoxPro start directory
  143.  
  144. Example:
  145. _GENSCRNX="C:\MYDIR\MYGENSCN.PRG"
  146.  
  147. Notes:
  148. When _GENSCRN="<pathname>\GENSCRNX.PRG", then 
  149. _GENSCRNX is used to specify which program is used to generate 
  150. screen code.  If _GENSCRNX is not specified in the 
  151. CONFIG.FP/CONFIG.FPW, the default setting is GENSCRN.PRG 
  152. located in FoxPro's start-up directory.
  153.  
  154.  
  155. _FOXSCX
  156.  
  157. Specifies database used for object library records.
  158.  
  159. Default:
  160. _FOXSCX="FOXSCX.DBF" in FoxPro start directory
  161.  
  162. Example: _FOXSCX="C:\MYDIR\FOXSCX.DBF"
  163.  
  164. Notes:
  165. It is recommended that all FoxPro 2.x CONFIG.FP/CONFIG.FPW contain 
  166. the same _FOXSCX setting.
  167.  
  168.  
  169. _SCXDRV1
  170.  
  171. Specifies global driver program.
  172.  
  173. Default:
  174. _SCXDRV1=""
  175.  
  176. _SCXDRV1 to _SCXDRV8
  177.  
  178. Specifies global driver program.  The numbers 1-8 represent various 
  179. driver hooks throughout GENSCRNX while the .SCX databases is being 
  180. generated.
  181.  
  182. Example:
  183. _SCXDRV5="C:\3DFOX\3D"
  184.  
  185.  
  186. _SPRDRV1
  187.  
  188. Specifies global driver program.
  189.  
  190. Default:
  191. _SPRDRV1=""
  192.  
  193. _SPRDRV1 to _SPRDRV6
  194.  
  195. Specifies global driver program.  The numbers 1-6 represent various 
  196. driver hooks throughout GENSCRNX while the .SPR file is being 
  197. updated.
  198.  
  199. Example:
  200. _SPRDRV1="C:\MYDIR\SPRUPD1"
  201.  
  202.  
  203. GENSCRNX
  204.  
  205. Specifies GENSCRNX functions enabled (ON) or disabled (OFF).
  206.  
  207. Default:
  208. GENSCRNX=ON
  209.  
  210.  
  211. COMPSPR
  212.  
  213. Specifies auto-compilation of .SPR file.  A public variable called 
  214. _COMPSPR to override the COMPSPR setting.
  215.  
  216. Default:
  217. COMPSPR=OFF
  218.  
  219. Important:
  220. This setting is ignored during screen building from projects.
  221.  
  222.  
  223. DISPSPR
  224.  
  225. Specifies auto-display of .SPR and .ERR files if an .ERR file is exists.  A 
  226. public variable called _DISPSPR to override the DISPSPR setting.
  227.  
  228. Default:
  229. DISPSPR=OFF
  230.  
  231.  
  232. Important:
  233. DISPSPR=ON may cause a file sharing error when SHARE.EXE is 
  234. installed.
  235.  
  236.  
  237.  
  238.  
  239. SETUP SNIPPET DIRECTIVE REFERENCE
  240.  
  241.  
  242. #:SECTION 3
  243.  
  244. Used in Setup snippet (like #SECTION 1 | 2) to insert code after GETs 
  245. and before READ in the Screen Layout.
  246.  
  247.  
  248. *:AUTORUN
  249.  
  250. Automatically releases screen after generation and executes generated 
  251. file.  *:AUTORUN is automatically disabled if either a compiled file is not 
  252. properly generated or a compile error was detected via the 
  253. COMPSPR=ON.
  254.  
  255.  
  256. *:COMPSPR
  257.  
  258. Overrides COMPSPR=OFF in CONFIG.FP/CONFIG.FPW.
  259.  
  260.  
  261. New:  *:DISPSPR
  262.  
  263. Overrides DISPSPR=OFF in CONFIG.FP/CONFIG.FPW.
  264.  
  265.  
  266. *:SET OPENFILES ON | OFF
  267.  
  268. Open files.
  269.  
  270. Example:
  271. *:SET OPENFILES ON
  272.  
  273.  
  274. *:SET CLOSEFILES ON | OFF
  275.  
  276. Close files.
  277.  
  278.  
  279.  *:SET DEFWINDS ON | OFF
  280.  
  281. Define windows.
  282.  
  283.  
  284. *:SET RELWINDS ON | OFF
  285.  
  286. Release windows.
  287.  
  288.  
  289. *:SET READCYCLE ON | OFF
  290.  
  291. Read cycle.
  292.  
  293.  
  294. *:SET MULTREADS ON | OFF
  295.  
  296. Multiple READs.
  297.  
  298.  
  299. *:SET NOLOCK ON | OFF
  300.  
  301. READ nolock.
  302.  
  303.  
  304. *:SET MODAL ON | OFF
  305.  
  306. Modal.
  307.  
  308.  
  309. *:SET PLATONLY ON | OFF
  310.  
  311. Current platform objects only.  If this setting is ON, GENSCRN will not 
  312. generate code for other platform code but GENSCRNX will still process 
  313. all platform records.  Setting PLATONLY='ON' in the 
  314. CONFIG.FP/CONFIG.FPW files will cause GENSCRNX to not pre or 
  315. post process other platform records.  See ADDITIONAL INFORMATION 
  316. section below for controlling this setting using a public variable.
  317.  
  318.  
  319. *:SET BORDERGETS ON | OFF
  320.  
  321. Border for GETs.
  322.  
  323.  
  324. *:SET ASSOCWINDS TO <window title list>
  325.  
  326. Assoc. windows list.  The <window title list> is appended to Assoc. 
  327. windows list from screen or project.
  328.  
  329. Example:
  330. *:SET ASSOCWINDS TO Calculator,Calendar
  331.  
  332.  
  333. *:OUTFILE <file>
  334.  
  335. Output file name.  *:OUTFILE is disabled when building screen from a 
  336. project.
  337.  
  338. Example:
  339. *:OUTFILE TEST.PRG
  340.  
  341.  
  342. *:PRG
  343.  
  344. A Setup snippet directive called *:PRG that is used to automatically 
  345. change the .SPR extension to a .PRG extension and also add the 
  346. #NOREAD PLAIN directive to the Setup snippet.  The *:PRG directive 
  347. used in conjunction with screen objects with the *:INSTXT directive will 
  348. allow a .PRG file to be created that has no GETs, SAYs, or READ, while 
  349. the screen builder Object Order controls the order of the FoxPro source 
  350. code generated in the .PRG file.  When building a screen from a project, 
  351. the *:PRG directive is ignored since the project expects that file specified 
  352. in the project to be generated and will abort project generation if the 
  353. project specified file is not created..
  354.  
  355.  
  356. *:PJXSET
  357.  
  358. Place in the Setup snippet before the *:PRG directive or any *:SET 
  359. directive to force the project information to have priority settings when 
  360. building the screen from a project.
  361.  
  362. Example:
  363. If the following was in the Setup snippet of a screen:
  364.  
  365. *:SET MODAL ON
  366. *:PJXSET
  367. *:SET READCYCLE OFF
  368.  
  369. Then if the screen was generated from the Screen Builder, the READ 
  370. would contain the clauses MODAL and CYCLE no matter what the check 
  371. box settings were set to before selecting <Generate>.  If the screen was 
  372. generated from a project, the READ would contain MODAL no matter 
  373. what the settings were set to in the project but the CYCLE setting would 
  374. be set to whatever the project setting was set to.
  375.  
  376.  
  377. *:BRACES
  378.  
  379. Overrides a CONFIG.FP/FPW setting of BRACES=OFF.
  380.  
  381.  
  382. *:NOBRACES
  383.  
  384. Turns off the auto braces detection for GENSCRNX.  By default, 
  385. GENSCRNX automatically searches all snippets for any {{<expC>}} 
  386. expressions to be evaluated.  For screens with many objects, this could 
  387. result in a few seconds overhead depending on the speed of the 
  388. computer being used.  Using *:NOBRACES will force GENSCRNX to 
  389. only evaluate snippets if *:EVLTXT is in the Comment snippet (or Setup 
  390. snippet for the header record).  Overrides a CONFIG.FP/FPW setting of 
  391. BRACES=ON.
  392.  
  393.  
  394. *:IGNOREBRACES
  395.  
  396. Ignores all {{<expC>}} expressions.  *:IGNOREBRACES cam only be 
  397. declared in the Setup snippet and overrides *:BRACES and 
  398. *:NOBRACES.
  399.  
  400.  
  401. *:SCNOBJ
  402.  
  403. Enables the invisible button m.scnobjn above to be generated.  Although 
  404. it is generated by default, *:SCNOBJ can be used to override a 
  405. SCNOBJ=OFF setting in the CONFIG.FP/FPW files.
  406.  
  407.  
  408. *:NOSCNOBJ
  409.  
  410. Disables the invisible button m.scnobjn above to be generated.  
  411. *:NOSCNOBJ can be used to override a SCNOBJ=ON setting in the 
  412. CONFIG.FP/FPW files. *:NOSCNOBJ is automatic when either the 
  413. #NOREAD directive exists in the Setup snippet or no GET objects exist 
  414. for the screen.
  415.  
  416.  
  417. *:DEFLIB <library name>
  418.  
  419. Defines library name.  *:DEFLIB can be used with stand alone screens 
  420. only and cannot be used with screens in a screen set.
  421.  
  422.  
  423. *:INCLIB <library name>
  424.  
  425. Includes library in base object search path.
  426.  
  427.  
  428. *:BASLIB <library name>
  429.  
  430. Base library objects for field name match.
  431.  
  432.  
  433. *:SAVESIZE
  434.  
  435. Used with *:DEFOBJ in a library object to force the SIZE information to 
  436. be retrieved fromt he library when the object is based in a screen.
  437.  
  438.  
  439. *:SAVEPICT
  440.  
  441. Used with *:DEFOBJs to force the PICTURE information to be retrieved 
  442. from the library when the object is based in a screen.
  443.  
  444.  
  445. *:BASBEFORE
  446.  
  447. Used with *:DEFOBJ in a library object to force any inherited expressions 
  448. or procedures to be inserted before rather than appended after to any 
  449. screen surface code.
  450.  
  451.  
  452. *:SCXDRV1 <file>
  453.  
  454. Specifies screen driver program.
  455.  
  456.  
  457. *:SCXDRV1 to *:SCXDRV8
  458.  
  459. Specifies screen driver program.  The numbers 1-8 represent various 
  460. driver hooks throughout GENSCRNX while the .SCX databases is being 
  461. generated.
  462.  
  463.  
  464. *:SPRDRV1 <file>
  465.  
  466. Specifies screen driver program.
  467.  
  468.  
  469. *:SPRDRV1 to *:SPRDRV6
  470.  
  471. Specifies screen driver program.  The numbers 1-6 represent various 
  472. driver hooks throughout GENSCRNX while the .SPR file is being 
  473. updated.
  474.  
  475.  
  476. *:MEMVAR
  477.  
  478. Replaces all aliases in GET name from alias.variable to m.variable.  All 
  479. alias.variable names referenced in the WHEN, VALID, ERROR, 
  480. MESSAGE, RANGE LO, and RANGE HIGH snippets will be replaced 
  481. with m.variable.
  482.  
  483.  
  484. *:NAME
  485.  
  486. The following example demonstrates how *:NAME affects FoxPro 2.5's 
  487. #NAME directive.
  488.  
  489. #NAME v_show
  490.  
  491. is changed to
  492.  
  493. #NAME v_showd  && _DOS=.T.
  494. #NAME v_showw  && _WINDOWS=.T
  495. #NAME v_showm  && _MAC=.T.
  496. #NAME v_showu  &&_UNIX=.T.
  497.  
  498. The above changes will occur before GENSCRN is called.
  499. Then, a function is appended to the Cleanup snippet as follows:
  500.  
  501. FUNCTION V_SHOW
  502.  
  503. DO CASE
  504.   CASE _DOS
  505.     RETURN V_SHOWD()
  506.   CASE _WINDOWS
  507.     RETURN V_SHOWW()
  508.   CASE _MAC
  509.     RETURN V_SHOWM()
  510.   CASE _UNIX
  511.     RETURN V_SHOWU()
  512. ENDCASE
  513. RETURN .F.
  514.  
  515. FUNCTION V_SHOWM
  516. RETURN .F.
  517.  
  518. FUNCTION V_SHOWU
  519. RETURN .F.
  520.  
  521. This will result in the exact same code execution as if a CASE _DOS, 
  522. CASE _WINDOWS, etc. was generated in the snippet.  The only rule is 
  523. that *:NAME uses only the first 9 characters of the snippet name 
  524. specified. The 10th character is used for the platform character.  Also, 
  525. any PARAMETER statement that follows the #NAME in the snippet will 
  526. be properly handled in the cross-platform function that is generated.  The 
  527. only rule here is that the PARAMETER statements must be identical for 
  528. all platforms having the same #NAME definition.
  529.  
  530.  
  531. *:NOGEN
  532.  
  533. Prevents GENSCRN from being called so that no .SPR file is generated.  
  534. *:NOGEN should be used with templates since templates do not need 
  535. code to be generated.
  536.  
  537.  
  538. *:NOXGEN
  539.  
  540. Prevents GENSCRNX from updating .SCX database and .SPR file.
  541.  
  542.  
  543.  *:GENSCRNX <file>
  544.  
  545. Used to specify which program is used to generate screen code.  
  546. *:GENSCRNX overrides any _GENSCRNX in the      CONFIG.FP and 
  547. CONFIG.FPW files. If both *:GENSCRNX and _GENSCRNX are 
  548. notspecified, the default setting is GENSCRN.PRG located in FoxPro's 
  549. start-up directory.  *:GENSCRNX can be used to specify a modified 
  550. GENSCRN needed for a particular screen rather than changing 
  551. _GENSCRN before generating a screen.
  552.  
  553.  
  554. *:NOCOMPSPR
  555.  
  556. Overrides COMPSPR=ON in CONFIG.FP/CONFIG.FPW.
  557.  
  558.  
  559. *:NODISPSPR
  560.  
  561. Overrides DISPSPR=ON in CONFIG.FP/CONFIG.FPW.
  562.  
  563.  
  564. *:NOWCLAUSES <clause list>
  565.  
  566. Removes a list of clauses from the DEFINE WINDOW command of a 
  567. screen.  Any list of clauses can be removed (except COLOR) by listing 
  568. the name of each clause separated by a space delimiter.
  569.  
  570. Example:
  571. Add following line in the Setup snippet to remove all FROM, TO, AT, 
  572. SIZE, FONT, and STYLE clauses will be removed from the DEFINE 
  573. WINDOW command:
  574.  
  575. *:NOWCLAUSES FROM TO AT SIZE FONT STYLE
  576.  
  577. To directly add any of the removed clauses, use GENSCRN's 
  578. #WCLAUSES directive.
  579.  
  580. Example:
  581. Add following lines in the Setup snippet to add a custom AT <row,col> 
  582. SIZE <height,width>:
  583.  
  584. *:NOWCLAUSES AT SIZE
  585. #WCLAUSES AT 1,1 SIZE 10,30
  586.  
  587. or
  588.  
  589. *:NOWCLAUSES AT SIZE
  590. #WCLAUSES AT {{VPOS}},{{HPOS}} SIZE {{HEIGHT}},{{WIDTH}}
  591.  
  592. Note:
  593. The {{<expC>}} evaluates any expression and replace its result as source 
  594. code.  In the above example, the field names are referencing the .SCX 
  595. header record which contains the screen layout window data.
  596.  
  597. Example:
  598. Add following lines in the Setup snippet to add a custom FONT 
  599. <fontface> STYLE <fontstyle>:
  600.  
  601. *:NOWCLAUSES FONT STYLE
  602. #WCLAUSES FONT m.myfontface STYLE m.myfontstyl
  603.  
  604.  
  605. *:DRVOFF <file>
  606.  
  607. Specified in the Setup snippet to disable any driver setting that is 
  608. specified in the CONFIG.FP/CONFIG.FPW.  The number of *:DRVOFF
  609. directives specified in the Setup snippet is unlimited and the files included 
  610. are retained for all screens in a screen set.  If *:DRVOFF is specifed in 
  611. the Setup snippet in a screen set, then all screens following in that screen 
  612. set will inherit the *:DRVOFF for the specified driver.
  613.  
  614. Example:
  615. If the 3D.PRG is specified in the CONFIG.FPW as 
  616. _SCXDRV5="3D.PRG", for the 3D driver to be executed globally for 
  617. every screen, then specifying *:DRVOFF 3D in the Setup snippet would 
  618. disable the 3D driver for that screen.
  619.  
  620.  
  621. GENSCRNX creates comments in the Setup snippet as that include the 
  622. the following information at compile time.
  623.  
  624. Example:
  625. *           This program was preprocessed by GENSCRNX.
  626. *--GENSCRNX 1.7
  627. *--Screen    C:\SAMPLE\CUST2.SCX
  628. *--Project   C:\SAMPLE\SAMPLE.PJX
  629. *--FOXSCX    C:\FOXPRO25\FOXSCX.DBF
  630. *--Platform  DOS
  631. *--Time      08/25/93 20:29:46
  632.  
  633.  
  634.  
  635.  
  636. COMMENT SNIPPET DIRECTIVE REFERENCE
  637.  
  638.  
  639. *:DEFOBJ <object name>
  640.  
  641. Defines object name.
  642.  
  643.  
  644. *:BASOBJ [<library name.]<object name>
  645.  
  646. Specify base object.
  647.  
  648.  
  649. *:INSOBJ [<library name.]<object name>
  650.  
  651. Insert object from FOXSCX.DBF in place of screen object.
  652.  
  653.  
  654. *:INSSCX <file>
  655.  
  656. Insert screen from template in place of screen object.  Using *:INSSCX 
  657. with FoxPro 2.0 and FoxPro 2.5 for DOS screens work are fully 
  658. compatible for both directions.
  659.  
  660.  
  661. *:FUNCTION <function name>
  662.  
  663. Automatically insert a function into the Cleanup snippet.  Function needs 
  664. to be written just like a typical FoxPro UDF except that *:FUNCTION is 
  665. used instead of FUNCTION.  GENSCRNX will automatically remove the 
  666. *: from *:FUNCTION.  Multiple *:FUNCTION/*:ENDFNCT text blocks can 
  667. exist per Comment snippet.  Also, muliptle FUNCTIONs can be definfed 
  668. between *:FUNCTION and *:ENDFNCT.
  669.  
  670. Example:
  671. x='This text does not get placed in the Cleanup snippet;
  672. *:FUNCTION beep1
  673. ?? CHR(7)
  674. *:ENDFNCT
  675. x='This text does not get placed in the Cleanup snippet'
  676.  
  677. Example:
  678. x='This text does not get placed in the Cleanup snippet'
  679. *:FUNCTION beep1
  680. ?? CHR(7)
  681. FUNCTION beep2
  682. ?? CHR(7)+CHR(7)
  683. *:ENDFNCT
  684. x='This text does not get placed in the Cleanup snippet'
  685.  
  686. Example:
  687. x='This text does not get placed in the Cleanup snippet'
  688. *:FUNCTION beep1
  689. ?? CHR(7)
  690. *:ENDFNCT
  691. x='This text does not get placed in the Cleanup snippet'
  692. *:FUNCTION beep2
  693. ?? CHR(7)+CHR(7)
  694. *:ENDFNCT
  695. x='This text does not get placed in the Cleanup snippet'
  696.  
  697.  
  698. *:ENDFNCT
  699.  
  700. Place at end of code that follows *:FUNCTION to mark ending of text.  
  701. *:ENDTXT is now used with *:INSTXT and is not used with *:FUNCTION.
  702.  
  703.  
  704. *:EVLTXT
  705.  
  706. By default, this directive is not needed.  *:EVLTXT is used to force 
  707. evaluation of any {{<expC>}} found in any of the snippets.  This directive 
  708. is only used when either *:NOBRACES is specified in the Setup snippet 
  709. or BRACES=OFF is specified in the CONFIG.FP/FPW.
  710.  
  711.  
  712. *:INSTXT
  713.  
  714. Insert all preceding text in place of screen object.
  715.  
  716.  
  717. *:ENDTXT
  718.  
  719. Place at end of code that follows *:INSTXT to mark ending of text.  
  720. *:ENDTXT is not required and is only used as a separator if non-
  721. *:INSTXT text follows the code to be inserted.
  722.  
  723.  
  724. *:TRNTXT <expC1> || <expC2> [|| <expN1> ] [|| <expN2>]]
  725.  
  726. Transform text of *all* memo fields.  The search is *not* case-sensitive.
  727.  
  728. <expC1>
  729. The character expression that's searched for.
  730.  
  731. <expC2>
  732. The search character expression <expC1> is replaced by the 
  733. character expression <expC2>.  If <expC2> is omitted, <expC1> is 
  734. replaced with
  735. the null string.
  736.  
  737. <expN1>
  738. The optional numeric expression <expN1> specifies which 
  739. occurrence of <expC1> is the first to be replaced.  For example, if 
  740. <expN1> is 4, replacement begins with the fourth occurrence, 
  741. counting from the left, and the first three occurrences remain 
  742. unchanged.  The occurrence where replacement begins defaults to 1 
  743. if <expN1> is omitted.
  744.  
  745. <expN2>
  746. <expN2> specifies the number of occurrences of <expC1> to 
  747. replace.  If <expN2> is omitted, all occurrences of <expC1>, starting 
  748. with the occurrence specified in <expN1>, are replaced.
  749.  
  750. Note:
  751. *:TRNTXT is mainly used with the *:BASOBJ command for data 
  752. translation of code being referenced from a library object.
  753.  
  754.  
  755. *:IF <expL>
  756.  
  757. Blocks object with IF ... ENDIF statements.
  758.  
  759.  
  760. *:SIZE <expC>
  761.  
  762. Replaces object SIZE clause with <expC>.  <expC> can be any 
  763. character expression, including variable names or FoxPro functions.
  764.  
  765.  
  766. *:NOSIZE
  767.  
  768. Removes SIZE clause from object.  *:NOSIZE is ignored for EDIT 
  769. objects.
  770.  
  771.  
  772. *:DEFAULT <expC>
  773.  
  774. Replaces object DEFAULT clause with <expC>.  <expC> can be any 
  775. character expression, including variable names or FoxPro functions.  
  776. Push buttons, Radio buttons, and Check boxes use the value of <expC>.  
  777. Lists, invisible buttons, and spinners cannot use the *:DEFAULT 
  778. directive.  All other  objects use <expC> with a direct replacement.  If a 
  779. character default is desired, be sure to include the quotes in the 
  780. expression.  If the current object's color is set to default, then a COLOR 
  781. SCHEME <expN> or COLOR <color pair list> may be included in 
  782. <expC>.
  783.  
  784.  
  785. *:PICTURE <expC>
  786.  
  787. Replaces object PICTURE clause with <expC>.  <expC> can be any 
  788. character expression, including variable names or FoxPro functions.  
  789. *:PICTURE can also be used to create multi-state .BMP/.ICO pictures for 
  790. check boxes, radio buttons, and push buttons (Windows platform only).
  791.  
  792. Example:
  793. To force a data driven PICTURE clause for a GET object using a variable
  794. called m.mypict, place the following in the Comment snippet:
  795.  
  796. *:PICTURE m.mypict
  797.  
  798. Example:
  799. To force a tri-state picture check box:
  800. *:PICTURE erase01.ico,erase02.ico,clear.ico
  801.       
  802. Example:
  803. To force a dual-state picture check box without respecifying the currently 
  804. set off mode picture:
  805. *:PICTURE ,fax2.ico
  806.  
  807. Note:
  808. If the first .BMP/.ICO file name in the comma separated list is left out as 
  809. in the above example, the picture current set by the screen builder will be 
  810. used as the off mode picture.  This way changing the off mode picture 
  811. can be done in the screen builder without having to also change in the 
  812. Comment snippet.
  813.       
  814.  
  815. *:REFRESH
  816.  
  817. Replaces object REFRESH clause with .T..  *:REFRESH will override the 
  818. refresh setting for a SAY object and can also be used to allow a picture to 
  819. be refreshed in the Read Level Show using either SHOW GETS or 
  820. SHOW GETS OFF.
  821.  
  822. Note:
  823. Using both *:REFRESH and *:PICTURE <variable name> with a picture 
  824. from file object can allow picture fields to be refreshed at runtime.  If a 
  825. transparent picture is used, any updated picture will overwrite (not erase) 
  826. the previous picture.  Using an opaque picture will overwrite and erase 
  827. the previous picture but will usually have a white background when using 
  828. a gray window background.  Another option if a transparent picture is 
  829. desired and when using the 3D driver for GENSCRNX (version 1.7 or 
  830. later) is to draw a box around the picture and use a *:3D <bevel width> 
  831. BOX REFRESH directive to allow the 3D box to be refreshed in the Read 
  832. Level Show using either SHOW GETS or SHOW GETS OFF.
  833.  
  834.  
  835. *:CLICK <function>
  836.  
  837. Adds invisible button with a WHEN snippet that calls the mouse click       
  838. function specified.  The () after the function name are only required if 
  839. parameters are passed.  In the Windows platform, *:CLICK supports text, 
  840. box, and picture objects while in the MS-DOS platform, *:CLICK supports 
  841. text and box objects. 
  842.       
  843. Example:
  844. To have a function called myfnct() exectuted from a mouse click on the 
  845. object, place the following in the Comment snippet:
  846.  
  847. *:CLICK myfnct
  848.  
  849.  
  850. *:DELETE
  851.  
  852. Delete screen object at compile time.  Use *:DELETE for objects that 
  853. need to appear while using the Screen Builder but not in the .SPR file at 
  854. run-time.
  855.  
  856.  
  857. *:DELOBJ
  858.  
  859. Delete screen object at compile time after preprocessing is complete.  
  860. Use *:DELOBJ for objects that need to reside in the .SCX database 
  861. during preprocessing but not in the .SPR file at run-time.
  862.  
  863.  
  864.  
  865.  
  866. PROCEDURE SNIPPET DIRECTIVE REFERENCE
  867.  
  868.  
  869. #:INSERT <file>
  870.  
  871. Screen generator directive inserts the contents of <file> into generated 
  872. screen code.  Not only does GENSCRNX support the #INSERT directive 
  873. for FoxPro 2.0, but the #:INSERT directive performs the same operation 
  874. as FoxPro 2.5's #INSERT except it is much faster when inserting large 
  875. files.
  876.  
  877.     FILE        GENSCRN      GENSCRNX
  878.     SIZE        #INSERT        #:INSERT
  879.    -----------------------------------------------------------
  880.     2K            3.215            2.938
  881.     135K        178.717         3.475
  882.     330K        970.478         6.630
  883.     ----------------------------------------------------------
  884.     Time is in seconds using 486-50DX
  885.  
  886. When using GENSCRNX, use #:INSERT instead of #INSERT for better 
  887. performance.
  888.  
  889.  
  890.  
  891. #:INSERTTOP <file>
  892.  
  893. Inserts file at top of .SPR code before DO CASE of cross-platform block.  
  894. If #:INSERTTOP <file> appears more than once due to cross-platform 
  895. snippets containing the same code, the <file> will only be inserted into the 
  896. .SPR once.  This allows header files containing #DEFINE directives to be 
  897. inserted once per .SPR file instead of one per platform inside the DO 
  898. CASE block.
  899.  
  900.  
  901.  
  902.  
  903. SNIPPET COMMAND REFERENCE
  904.  
  905.  
  906. {{<expC>}}
  907.  
  908. Text surrounded by double braces performs the EVALUATION of 
  909. <expC> at compile time and returns the value in string form.  {{<expC>}} 
  910. is replaced with the string of EVALUATE(<expC>).  <expC> can be any 
  911. type (character, numeric, date, logical, etc.) and {{<expC>}} will always 
  912. return the result in character form.
  913.  
  914. Example:
  915. If the following command was in the Setup snippet and assuming the 
  916. current date was 06/01/93:
  917.  
  918. WAIT '{{DATE()}}' WINDOW NOWAIT
  919.  
  920. the following code would be placed in the .SPR:
  921.  
  922. WAIT '06/01/93' WINDOW NOWAIT
  923.  
  924. If the following command was in the Valid snippet:
  925.  
  926. DEFINE POPUP pop_test FROM {{VPOS+HEIGHT}},{{HPOS-1}};
  927.   TO {{VPOS+HEIGHT+7}},{{HPOS+WIDTH}};
  928.   PROMPT FIELD items.item
  929.  
  930. and VPOS=5, HPOS=10, WIDTH=8, HEIGHT=1 in the .SCX database, 
  931. then the following code would result in the Valid snippet of that object in 
  932. the .SPR:
  933.  
  934. DEFINE POPUP pop_test FROM 6,9;
  935.   TO 13,18;
  936.   PROMPT FIELD items.item
  937.  
  938.  
  939. {{&.<expC>}}
  940.  
  941. Text surrounded by double braces with a &. immediately after the open 
  942. braces performs the macro substitution of <expC> at compile time and 
  943. returns a null value in string form.  {{<expC>}} is replaced with a null 
  944. string.  <expC> can be any FoxPro command that can be executed within 
  945. a macro substitution string.
  946.  
  947. Example:
  948. If the following command was in the Setup snippet and assuming the 
  949. current date was 06/01/93:
  950.  
  951. {{& WAIT '{{DATE()}}' WINDOW NOWAIT}}
  952.  
  953. the following WAIT window would appear at compile time of the screen:
  954.  
  955. 06/01/93
  956.  
  957. If the following command was in the Setup snippet:
  958.  
  959. {{&.DO MYPROG}}
  960.  
  961. then a program called MYPROG would be executed as a subroutine at 
  962. compile time of the screen.  If the program was to return a character 
  963. string for code insertion, then {{MYPROG()}} would have been used.
  964.  
  965.  
  966. {{< <file> }}
  967. Insert a file at compile time.  The < that follows the open braces is the 
  968. command that evaluates the contents of a file and inserts the file at that 
  969. location.  {{< <file> }} can be included in the Comment snippet and the file 
  970. inserted can contain other GENSCRNX directives and also may contain 
  971. any {{<expC>}} expressions to be evaluated.
  972.  
  973. Example:
  974. If the following command was in the Comment snippet of a GET object:
  975.  
  976. {{<PSWDCHK.PRG}}
  977.  
  978. and PSWDCHK.PRG contained the following lines:
  979.  
  980. *:IF m.password>=5
  981.  
  982. then the resulting code in the .SPR would be:
  983.  
  984. IF m.password>=5
  985.     @ row,col GET expr
  986. ENDIF
  987.  
  988.  
  989. {{@ <expC> }}
  990.  
  991. Retrieve a directive at compile time.  The @ that follows the open braces 
  992. is the command that performs a wordsearch() operation in the Comment 
  993. or Setup snippet searching for the directive specified by <expC>.  {{@ 
  994. <expC> }} can be included in the Comment snippet and the file inserted 
  995. can contain other GENSCRNX directives and also may contain any 
  996. {{<expC>}} expressions to be evaluated.
  997.  
  998. Example:
  999. If the following command was in the Valid snippet of a GET object that 
  1000. had a *:IF m.p>5 in the Comment snippet:
  1001.  
  1002. WAIT 'IF: {{@*:IF}}' WINDOW NOWAIT
  1003.  
  1004. then the resulting code in the .SPR would be:
  1005.  
  1006. WAIT 'IF: m.p>5' WINDOW NOWAIT
  1007.  
  1008. Example:
  1009. If the following command was in the Comment snippet of an object:
  1010.  
  1011. {{Button1::@*:IF}}
  1012.  
  1013. then the object would use the *:IF directive specifed in an object 
  1014. containing *:DEFOBJ Button1 in the Comment snippet.
  1015.  
  1016. Example:
  1017. If the following command was in the Setup snippet of an object:
  1018.  
  1019. *:SCXDRV5 3D
  1020. *:ALL3D {{MAIN.All3D_Setting::@*:ALL3D}}
  1021.  
  1022. while a library MAIN contains an object called All3D_Setting that 
  1023. contained *:ALL3D 4 in the Setup snippet then the 3D driver would use a 
  1024. shadow of 4 pixels as the default for all 3D objects.  The Setup snippet 
  1025. would result in the following:
  1026.       
  1027. *:SCXDRV5 3D
  1028. *:ALL3D 4
  1029.  
  1030. The above technique can be used to control default settings in a globally 
  1031. to have muliptle screens use the same directive settings.
  1032.  
  1033.  
  1034. *:METHOD
  1035.  
  1036. Place at start of code to mark beginning of method code.
  1037.  
  1038.  
  1039. *:ENDMTHD
  1040.  
  1041. Place at end of the code that follows *:METHOD to mark ending of text.
  1042.  
  1043.  
  1044. {{ <expC1> :: [<expC2>] [:: <expC3>] }}
  1045.  
  1046. Insert code from a screen or library object.  <expC1> is the library.object 
  1047. name just as in *:DEFOBJ, *:BASOBJ, etc.  Note if the library name is not 
  1048. included, the object is searched for specified by the *:INCLIB and 
  1049. *:BASLIB directives in the Setup snippet.  Also, if a matching object is 
  1050. defined via the *:DEFOBJ directive on the surface screen, that object will 
  1051. have proirity over any matching library objects.  <expC2> is the string to 
  1052. be evaluated.  After the .SCX record is matched, any string can be 
  1053. evaluated (ex. 'VALID' to return the VALID snippet).  If <expC2> is null, 
  1054. the COMMENT contents will be returned.  <expC3> is the option method 
  1055. name.  If <expC3> is included, the text block specified by the matching 
  1056. method defined by *:METHOD <name> ... *:ENDMTHD is returned.
  1057.  
  1058. Example:
  1059. Suppose the following code is placed in the WHEN snippet of an object 
  1060. used for entering a Phone number and *:DEFOBJ Get_Phone was 
  1061. placed in the Comment snippet to label the object:
  1062.  
  1063. *:METHOD Check_MDOWN
  1064. IF .NOT.MDOWN()
  1065.   RETURN .F.
  1066. ENDIF
  1067. *:ENDMTHD
  1068. *:METHOD Check_EditMode
  1069. IF .NOT.m.editmode
  1070.   RETURN .F.
  1071. ENDIF
  1072. *:ENDMTHD
  1073.  
  1074. Suppose you wanted the WHEN snippet of another object to contain the 
  1075. code used to check for the mouse being pressed but not for the edit 
  1076. mode status.  Instead of using the copy and paste method, place the 
  1077. following line of code in the WHEN snippet:
  1078.  
  1079. {{Get_Phone::WHEN::Check_MDOWN}}
  1080.  
  1081. then the resulting code in the WHEN snippet would be:
  1082.  
  1083. IF .NOT.MDOWN()
  1084.   RETURN .F.
  1085. ENDIF
  1086.  
  1087. Suppose you wanted the WHEN snippet of another object to contain all 
  1088. code used in the Phone object's WHEN snippet but wanted a beep to 
  1089. occur before the check.  Instead of using the copy and paste method, 
  1090. place the following line of code in the WHEN snippet:
  1091.  
  1092. ?? CHR(7)
  1093. {{Get_Phone::WHEN}}
  1094.  
  1095. then the resulting code in the WHEN snippet would be:
  1096.  
  1097. ?? CHR(7)
  1098. IF .NOT.MDOWN()
  1099.   RETURN .F.
  1100. ENDIF
  1101. IF .NOT.m.editmode
  1102.   RETURN .F.
  1103. ENDIF
  1104.  
  1105. Note:
  1106. The expression {{Get_Phone::}} is identical to {{Get_Phone::COMMENT}} 
  1107. since the Comment snippet is the default.
  1108.  
  1109. Note:
  1110. Complex expressions can be used like the following:
  1111. {{Get_Phone::WHEN+VALID}} which would insert both the WHEN and 
  1112. VALID snippets of the Get_Phone object.
  1113.  
  1114.  
  1115.  
  1116.  
  1117. DRIVER INFORMATION
  1118.  
  1119.  
  1120. Driver programs are specified either in the CONFIG.FP/CONFIG.FPW 
  1121. files by defining:
  1122.  
  1123. _SCXDRV3="<pathname>\[<file>]".
  1124.  
  1125. Driver programs can also be specified a screen Setup snippet by 
  1126. defining:
  1127.  
  1128. *:SCXDRV3 <pathname>\[<file>].
  1129.  
  1130. *:SCXDRV1 is used before any GENSCRNX compilation.  It can be used 
  1131. as a #INCLUDE to add any GENSCRN or GENSCRNX directives.  
  1132. Another method of obtaining a #INCLUDE type function is the use the 
  1133. braces ({{<expC>}}) when <expC> contains an external function.  The 
  1134. character string returned from the function will replace the {{<expC>}} 
  1135. directly.  For example, if the Setup snippet contained the following line:
  1136.  
  1137. {{inc_test()}}
  1138.  
  1139. and the external function inc_test() return a character string of 
  1140. #NOREAD, then the {{inc_test()}} line would be directly replaced by the 
  1141. #NOREAD command.  Also, the returned character string may contain a 
  1142. carriage return and line feeds (CHR(13)+CHR(10)) to separate lines 
  1143. when multiple lines are needed for insertion.  Refer to the {{<expC>}} 
  1144. definition supplied with GENSCRNX for further information.
  1145. Notes:
  1146. If the <file> parameter of a driver directive does not include a file 
  1147. extension, the following extensions are checked in this order:
  1148. .EXE, .APP, .PRG, .FXP
  1149.  
  1150. The n in SCXDRVn represents the hook number from GENSCRNX.  
  1151. GENSCRNX has 8 different places during the compiling loop that can call 
  1152. out to drivers.  The most common one to use is #3.  You can have infinite 
  1153. drivers for #3:
  1154.  
  1155. Example:
  1156. *:SCXDRV3 <driver1>
  1157. *:SCXDRV3 <driver2>
  1158.  
  1159. The order they are listed is the order they are called.  Hook #1 is before 
  1160. compilation (like #INCLUDE), hook #2 is the first in the first compile loop, 
  1161. hook #3 is the first in each compile loop, #7 is after preprocessing 
  1162. (except *:FUNCTION and the insertion of _ScnObjn) is complete, and #8 
  1163. is after all preprocessing is complete.
  1164.  
  1165. Important:
  1166. Only one driver can be specified in the CONFIG.FP/CONFIG.FPW files.  
  1167. If more than one driver is specified in the Setup snippet, the drivers are 
  1168. called in the order they are listed.  Drivers specified in the 
  1169. CONFIG.FP/CONFIG.FPW are called before the drivers specified in the 
  1170. Setup snippet.
  1171.  
  1172.  
  1173.  
  1174.  
  1175. USING GENSCRNX AS TRANSPORTX
  1176.  
  1177.  
  1178. In the CONFIG.FP/FPW file, you can place the following:
  1179.  
  1180. _TRANSPRT="<path>GENSCRNX.PRG"
  1181. _TRNDRV1="<path><prg 1>"
  1182. _TRNDRV2="<path><prg 2>"
  1183.  
  1184. What happens here is that whenever the FoxPro calls the transporter, the 
  1185. following occurs:
  1186.  
  1187. 1) GENSCRNX gets called.
  1188. 2) If prg 1 is defined as above, prg 1 is called.
  1189. 3) Based on the return value of prg 1, GENSCRNX will either return an 
  1190. open as is, cancel, or call TRANSPRT.PRG.
  1191. 4) Upon return from TRANSPRT.PRG, if prg 2 is defined as above, prg 2 
  1192. is called.
  1193.  
  1194. Notes:
  1195.  
  1196. <prg 1> can be used as a custom control program to determine if the 
  1197. transporter needs to be called or any preprocessing needs to occur to the 
  1198. .SCX before TRANSPRT.PRG is called.
  1199.  
  1200. <prg 2> can be used to updated the .SCX after TRANSPRT.PRG is 
  1201. complete to override any unwanted defaults such as fonts, row/column, 
  1202. screen color, or .SCX header information.
  1203.  
  1204.  
  1205.  
  1206.  
  1207. ADDITIONAL INFORMATION
  1208.  
  1209.  
  1210. For performance optimization, GENSCRNX only pre and post processes 
  1211. a screen if the *: or {{ characters exist somewhere in either the Setup 
  1212. snippet or at least one of the Comment snippets.  The first screen a 
  1213. screen set of more than one screen must have either a GENSCRNX 
  1214. directive or at least a simple *: in the Setup snippet of the first screen for 
  1215. GENSCRNX to properly preprocess the screen set.
  1216.  
  1217. All *: directives used for GENSCRNX must be specified starting in column 
  1218. one of the snippet.  Do not indent the *: directives with spaces or tabs.
  1219.  
  1220. GENSCRNX automatically creates two null invisible button at row,col 0,0 
  1221. as the first and last GET in the Screen Layout.  Each screen of a screen 
  1222. set will have two null invisible buttons with the name corresponding to the 
  1223. screen set.  Since the invisible button's WHEN is set to .F., the objects 
  1224. are null objects and have no effect on the generated screen.  The 
  1225. purpose of this is to allow generic reference to the first or last GET object 
  1226. in any screen of a screen set.  For example in a screen set with one 
  1227. screen, the first GET would be m.scnobj1 and the last GET would be 
  1228. m.scnend1.
  1229.  
  1230. Example:
  1231. _CUROBJ=OBJNUM('m.scnobj1')
  1232.  
  1233. Example:  The first GET of the first screen of a screen set would have an 
  1234. invisible button at 0,0 called m.scnobj1 while the second screen of a 
  1235. screen set would have an invisible button called m.scnobj2.
  1236.  
  1237. When using the Standard version of FoxPro for MS-DOS, the .SPR file 
  1238. size must be less than 64K.
  1239.  
  1240. If a public variable called _GENSCRNX is set to OFF, GENSCRNX with 
  1241. pass the .SCX directly to GENSCRN and all GENSCRNX directives and 
  1242. commands will be ignored.  GENSCRNX can also be specified in the 
  1243. CONFIG.FP/CONFIG.FPW files and changed without re-entering 
  1244. FoxPro.
  1245.  
  1246. If a public variable called _PLATONLY is set to ON, GENSCRNX and 
  1247. GENSCRN will only generate code for the current running platform.  
  1248. PLATONLY can also be specified in the CONFIG.FP/CONFIG.FPW files 
  1249. and changed without re-entering FoxPro.  _PLATONLY='ON' is useful 
  1250. during development when cross-platform code generation is not required 
  1251. for screens until development is complete.
  1252.  
  1253.  
  1254.  
  1255.  
  1256. COPYRIGHT NOTICE
  1257.  
  1258.  
  1259. Compressed file: GENSCRNX.ZIP
  1260. System: GenScrnX
  1261. Author: Ken R. Levy
  1262. Company: Jet Propulsion Laboratory
  1263. Copyright: None (Public Domain)
  1264.  
  1265. All source code and documentation contained in GENSCRNX.ZIP was 
  1266. developed at the Jet Propulsion Laboratory in Pasadena, Calif. and has 
  1267. been placed into the public domain.  You may use, modify, copy, 
  1268. distribute, and demonstrate any source code, example programs, or 
  1269. documentation contained in GENSCRNX.ZIP freely without copyright 
  1270. protection.  All files contained in GENSCRNX.ZIP are provided 'as is' 
  1271. without warranty of any kind.  In no event shall its authors, contributors, 
  1272. or distributors be liable for any damages.
  1273.  
  1274.  
  1275.  
  1276.  
  1277. COMMENTS/SUGGESTIONS/PROBLEMS/QUESTIONS
  1278.  
  1279.  
  1280. Please use CompuServe's FoxForum (section 3rd Party Products) 
  1281. directed to:
  1282.  
  1283. Ken Levy 76350,2610
  1284.  
  1285. -----------------------------------------------------------
  1286.  
  1287.  
  1288.